﻿/* =====================================================
   Copyright (C) by Huu Tai Analyzer.
   ===================================================== */
using System;
using System.Collections.Generic;
using System.Text;

namespace Library.Font
{
    public class ConvertFont
    {
        #region Enums
        public enum VietEncodings
        {
            NCR,
            TCVN3,
            Unicode_Composite,
            VIQR,
            VISCII,
            VNI,
            VPS
        }
        #endregion

        #region Properties
        string[] _sourceChars;
        public string[] SourceChars
        {
            get { return _sourceChars; }
        }

        string[] _unicodeChars;
        public string[] UnicodeChars
        {
            get { return _unicodeChars; }
        }
        #endregion

        #region Constructors
        public ConvertFont(VietEncodings sourceEncoding)
        {
            switch (sourceEncoding)
            {
                case VietEncodings.TCVN3:
                    _sourceChars = new string[] { 
                        "\x00fc", "\x00fb", "\x00fe", "\x00fa", "\x00f9", "\x00f7", "\x00f6", "\x00f5", "\x00f8", "\x00f1", "\x00f4", "\x00ee", "\x00ec", "\x00eb", "\x00ea", "\x00ed", 
                        "\x00e9", "\x00e7", "\x00e6", "\x00e5", "\x00e8", "\x00e1", "\x00e4", "\x00de", "\x00d8", "\x00d6", "\x00d4", "\x00d3", "\x00d2", "\x00d5", "\x00cf", "\x00ce", 
                        "\x00d1", "\x00c6", "\x00bd", "\x00bc", "\x00ab", "\x00be", "\x00cb", "\x00c9", "\x00c8", "\x00c7", "\x00ca", "\x00b6", "\x00b9", "\x00ad", "\x00a6", "\x00ac", 
                        "\x00a5", "\x00f2", "\x00dc", "\x00ae", "\x00a8", "\x00a1", "\x00f3", "\x00ef", "\x00e2", "\x00bb", "\x00e3", "\x00df", "\x00dd", "\x00d7", "\x00aa", "\x00d0", 
                        "\x00cc", "\x00b7", "\x00a9", "\x00b8", "\x00b5", "\x00a4", "\x00a7", "\x00a3", "\x00a2", "A\x00e0", "Aả", "A\x00e3", "A\x00e1", "Aạ", "E\x00e8", "Eẻ", 
                        "Eẽ", "E\x00e9", "Eẹ", "I\x00ec", "Iỉ", "Iĩ", "I\x00ed", "Iị", "O\x00f2", "Oỏ", "O\x00f5", "O\x00f3", "Oọ", "U\x00f9", "Uủ", "Uũ", 
                        "U\x00fa", "Uụ", "Yỳ", "Yỷ", "Yỹ", "Y\x00fd", "Yỵ", "Ăằ", "Ăẳ", "Ăẵ", "Ăắ", "Ăặ", "\x00c2ầ", "\x00c2ẩ", "\x00c2ẫ", "\x00c2ấ", 
                        "\x00c2ậ", "\x00caề", "\x00caể", "\x00caễ", "\x00caế", "\x00caệ", "\x00d4ồ", "\x00d4ổ", "\x00d4ỗ", "\x00d4ố", "\x00d4ộ", "Ơờ", "Ơở", "Ơỡ", "Ơớ", "Ơợ", 
                        "Ưừ", "Ưử", "Ưữ", "Ưứ", "Ưự"
                    };
                    _unicodeChars = new string[] { 
                        "ỹ", "ỷ", "ỵ", "ỳ", "ự", "ữ", "ử", "ừ", "ứ", "ủ", "ụ", "ợ", "ỡ", "ở", "ờ", "ớ", 
                        "ộ", "ỗ", "ổ", "ồ", "ố", "ỏ", "ọ", "ị", "ỉ", "ệ", "ễ", "ể", "ề", "ế", "ẽ", "ẻ", 
                        "ẹ", "ặ", "ẵ", "ẳ", "\x00f4", "ắ", "ậ", "ẫ", "ẩ", "ầ", "ấ", "ả", "ạ", "ư", "Ư", "ơ", 
                        "Ơ", "ũ", "ĩ", "đ", "ă", "Ă", "\x00fa", "\x00f9", "\x00f5", "ằ", "\x00f3", "\x00f2", "\x00ed", "\x00ec", "\x00ea", "\x00e9", 
                        "\x00e8", "\x00e3", "\x00e2", "\x00e1", "\x00e0", "\x00d4", "Đ", "\x00ca", "\x00c2", "\x00c0", "Ả", "\x00c3", "\x00c1", "Ạ", "\x00c8", "Ẻ", 
                        "Ẽ", "\x00c9", "Ẹ", "\x00cc", "Ỉ", "Ĩ", "\x00cd", "Ị", "\x00d2", "Ỏ", "\x00d5", "\x00d3", "Ọ", "\x00d9", "Ủ", "Ũ", 
                        "\x00da", "Ụ", "Ỳ", "Ỷ", "Ỹ", "\x00dd", "Ỵ", "Ằ", "Ẳ", "Ẵ", "Ắ", "Ặ", "Ầ", "Ẩ", "Ẫ", "Ấ", 
                        "Ậ", "Ề", "Ể", "Ễ", "Ế", "Ệ", "Ồ", "Ổ", "Ỗ", "Ố", "Ộ", "Ờ", "Ở", "Ỡ", "Ớ", "Ợ", 
                        "Ừ", "Ử", "Ữ", "Ứ", "Ự"
                    };
                    break;
                case VietEncodings.Unicode_Composite:
                    _sourceChars = new string[] { 
                        "à", "À", "ả", "Ả", "ã", "Ã", "á", "Á", "ạ", "Ạ", "ằ", "Ằ", "ẳ", "Ẳ", "ẵ", "Ẵ", 
                        "ắ", "Ắ", "ặ", "Ặ", "\x00e2̀", "\x00c2̀", "\x00e2̉", "\x00c2̉", "\x00e2̃", "\x00c2̃", "\x00e2́", "\x00c2́", "\x00e2̣", "\x00c2̣", "è", "È", 
                        "ẻ", "Ẻ", "ẽ", "Ẽ", "é", "É", "ẹ", "Ẹ", "\x00eà", "\x00cà", "\x00eả", "\x00cả", "\x00eã", "\x00cã", "\x00eá", "\x00cá", 
                        "\x00eạ", "\x00cạ", "ì", "Ì", "ỉ", "Ỉ", "ĩ", "Ĩ", "í", "Í", "ị", "Ị", "ò", "Ò", "ỏ", "Ỏ", 
                        "õ", "Õ", "ó", "Ó", "ọ", "Ọ", "\x00f4̀", "\x00d4̀", "\x00f4̉", "\x00d4̉", "\x00f4̃", "\x00d4̃", "\x00f4́", "\x00d4́", "\x00f4̣", "\x00d4̣", 
                        "ờ", "Ờ", "ở", "Ở", "ỡ", "Ỡ", "ớ", "Ớ", "ợ", "Ợ", "ù", "Ù", "ủ", "Ủ", "ũ", "Ũ", 
                        "ú", "Ú", "ụ", "Ụ", "ừ", "Ừ", "ử", "Ử", "ữ", "Ữ", "ứ", "Ứ", "ự", "Ự", "ỳ", "Ỳ", 
                        "ỷ", "Ỷ", "ỹ", "Ỹ", "ý", "Ý", "ỵ", "Ỵ"
                    };
                    _unicodeChars = new string[] { 
                        "\x00e0", "\x00c0", "ả", "Ả", "\x00e3", "\x00c3", "\x00e1", "\x00c1", "ạ", "Ạ", "ằ", "Ằ", "ẳ", "Ẳ", "ẵ", "Ẵ", 
                        "ắ", "Ắ", "ặ", "Ặ", "ầ", "Ầ", "ẩ", "Ẩ", "ẫ", "Ẫ", "ấ", "Ấ", "ậ", "Ậ", "\x00e8", "\x00c8", 
                        "ẻ", "Ẻ", "ẽ", "Ẽ", "\x00e9", "\x00c9", "ẹ", "Ẹ", "ề", "Ề", "ể", "Ể", "ễ", "Ễ", "ế", "Ế", 
                        "ệ", "Ệ", "\x00ec", "\x00cc", "ỉ", "Ỉ", "ĩ", "Ĩ", "\x00ed", "\x00cd", "ị", "Ị", "\x00f2", "\x00d2", "ỏ", "Ỏ", 
                        "\x00f5", "\x00d5", "\x00f3", "\x00d3", "ọ", "Ọ", "ồ", "Ồ", "ổ", "Ổ", "ỗ", "Ỗ", "ố", "Ố", "ộ", "Ộ", 
                        "ờ", "Ờ", "ở", "Ở", "ỡ", "Ỡ", "ớ", "Ớ", "ợ", "Ợ", "\x00f9", "\x00d9", "ủ", "Ủ", "ũ", "Ũ", 
                        "\x00fa", "\x00da", "ụ", "Ụ", "ừ", "Ừ", "ử", "Ử", "ữ", "Ữ", "ứ", "Ứ", "ự", "Ự", "ỳ", "Ỳ", 
                        "ỷ", "Ỷ", "ỹ", "Ỹ", "\x00fd", "\x00dd", "ỵ", "Ỵ"
                    };
                    break;
                case VietEncodings.VIQR:
                    _sourceChars = new string[] { 
                        "u*", "U*", "o*", "O*", "Dd", "D-", "d-", "y~", "Y~", "y?", "Y?", "y.", "Y.", "y`", "Y`", "u+.", 
                        "U+.", "u+~", "U+~", "u+?", "U+?", "u+`", "U+`", "u+'", "U+'", "u?", "U?", "u.", "U.", "o+.", "O+.", "o+~", 
                        "O+~", "o+?", "O+?", "o+`", "O+`", "o+'", "O+'", "o^^.", "O^^.", "o^^~", "O^^~", "o^^?", "O^^?", "o^^`", "O^^`", "o^^'", 
                        "O^^'", "o?", "O?", "o.", "O.", "i.", "I.", "i?", "I?", "e^^.", "E^^.", "e^^~", "E^^~", "e^^?", "E^^?", "e^^`", 
                        "E^^`", "e^^'", "E^^'", "e~", "E~", "e?", "E?", "e.", "E.", "a(.", "A(.", "a(~", "A(~", "a(?", "A(?", "a(`", 
                        "A(`", "a('", "A('", "a^^.", "A^^.", "a^^~", "A^^~", "a^^?", "A^^?", "a^^`", "A^^`", "a^^'", "A^^'", "a?", "A?", "a.", 
                        "A.", "u+", "U+", "o+", "O+", "u~", "U~", "i~", "I~", "dd", "a(", "A(", "y'", "u'", "u`", "o~", 
                        "o^^", "o'", "o`", "i'", "i`", "e^^", "e'", "e`", "a~", "a^^", "a'", "a`", "Y'", "U'", "U`", "O~", 
                        "O^^", "O'", "O`", "DD", "Dd", "I'", "I`", "E^^", "E'", "E`", "A~", "A^^", "A'", "A`", @"\.", @"\?", 
                        @"\d", @"\D", @"\'"
                    };
                    _unicodeChars = new string[] { 
                        "u+", "U+", "o+", "O+", "DD", "DD", "dd", "ỹ", "Ỹ", "ỷ", "Ỷ", "ỵ", "Ỵ", "ỳ", "Ỳ", "ự", 
                        "Ự", "ữ", "Ữ", "ử", "Ử", "ừ", "Ừ", "ứ", "Ứ", "ủ", "Ủ", "ụ", "Ụ", "ợ", "Ợ", "ỡ", 
                        "Ỡ", "ở", "Ở", "ờ", "Ờ", "ớ", "Ớ", "ộ", "Ộ", "ỗ", "Ỗ", "ổ", "Ổ", "ồ", "Ồ", "ố", 
                        "Ố", "ỏ", "Ỏ", "ọ", "Ọ", "ị", "Ị", "ỉ", "Ỉ", "ệ", "Ệ", "ễ", "Ễ", "ể", "Ể", "ề", 
                        "Ề", "ế", "Ế", "ẽ", "Ẽ", "ẻ", "Ẻ", "ẹ", "Ẹ", "ặ", "Ặ", "ẵ", "Ẵ", "ẳ", "Ẳ", "ằ", 
                        "Ằ", "ắ", "Ắ", "ậ", "Ậ", "ẫ", "Ẫ", "ẩ", "Ẩ", "ầ", "Ầ", "ấ", "Ấ", "ả", "Ả", "ạ", 
                        "Ạ", "ư", "Ư", "ơ", "Ơ", "ũ", "Ũ", "ĩ", "Ĩ", "đ", "ă", "Ă", "\x00fd", "\x00fa", "\x00f9", "\x00f5", 
                        "\x00f4", "\x00f3", "\x00f2", "\x00ed", "\x00ec", "\x00ea", "\x00e9", "\x00e8", "\x00e3", "\x00e2", "\x00e1", "\x00e0", "\x00dd", "\x00da", "\x00d9", "\x00d5", 
                        "\x00d4", "\x00d3", "\x00d2", "Đ", "Đ", "\x00cd", "\x00cc", "\x00ca", "\x00c9", "\x00c8", "\x00c3", "\x00c2", "\x00c1", "\x00c0", ".", "?", 
                        "d", "D", "'"
                    };
                    break;
                case VietEncodings.VISCII:
                    _sourceChars = new string[] { 
                        "‑", "\x00c5", "\x00e5", "\x00f0", "\x00ce", "\x00ee", "\x009d", "\x00fb", "\x00b4", "\x00bd", "\x00bf", "\x00df", "\x0080", "\x00d5", "\x00c4", "\x00e4", 
                        "\x0084", "\x00a4", "\x0085", "\x00a5", "\x0086", "\x00a6", "\x0006", "\x00e7", "\x0087", "\x00a7", "\x0081", "\x00a1", "\x0082", "\x00a2", "\x0002", "\x00c6", 
                        "\x0005", "\x00c7", "\x0083", "\x00a3", "\x0089", "\x00a9", "\x00cb", "\x00eb", "\x0088", "\x00a8", "\x008a", "\x00aa", "\x008b", "\x00ab", "\x008c", "\x00ac", 
                        "\x008d", "\x00ad", "\x008e", "\x00ae", "\x009b", "\x00ef", "\x0098", "\x00b8", "\x009a", "\x00f7", "\x0099", "\x00f6", "\x008f", "\x00af", "\x0090", "\x00b0", 
                        "\x0091", "\x00b1", "\x0092", "\x00b2", "\x0093", "\x00b5", "\x0095", "\x00be", "\x0096", "\x00b6", "\x0097", "\x00b7", "\x00b3", "\x00de", "\x0094", "\x00fe", 
                        "\x009e", "\x00f8", "\x009c", "\x00fc", "\x00ba", "\x00d1", "\x00bb", "\x00d7", "\x00bc", "\x00d8", "\x00ff", "\x00e6", "\x00b9", "\x00f1", "\x009f", "\x00cf", 
                        "\x001e", "\x00dc", "\x0014", "\x00d6", "\x0019", "\x00db", "\x00a0", "€", "„", "…", "†", "‡", "‚", "ƒ", "‰", "ˆ", 
                        "Š", "‹", "Œ", "Ž", "›", "˜", "š", "™", "‘", "’", "“", "•", "–", "—", "”", "ž", 
                        "œ", "Ÿ"
                     };
                    _unicodeChars = new string[] { 
                        "Ỵ", "Ă", "ă", "đ", "Ĩ", "ĩ", "Ũ", "ũ", "Ơ", "ơ", "Ư", "ư", "Ạ", "ạ", "Ả", "ả", 
                        "Ấ", "ấ", "Ầ", "ầ", "Ẩ", "ẩ", "Ẫ", "ẫ", "Ậ", "ậ", "Ắ", "ắ", "Ằ", "ằ", "Ẳ", "ẳ", 
                        "Ẵ", "ẵ", "Ặ", "ặ", "Ẹ", "ẹ", "Ẻ", "ẻ", "Ẽ", "ẽ", "Ế", "ế", "Ề", "ề", "Ể", "ể", 
                        "Ễ", "ễ", "Ệ", "ệ", "Ỉ", "ỉ", "Ị", "ị", "Ọ", "ọ", "Ỏ", "ỏ", "Ố", "ố", "Ồ", "ồ", 
                        "Ổ", "ổ", "Ỗ", "ỗ", "Ộ", "ộ", "Ớ", "ớ", "Ờ", "ờ", "Ở", "ở", "Ỡ", "ỡ", "Ợ", "ợ", 
                        "Ụ", "ụ", "Ủ", "ủ", "Ứ", "ứ", "Ừ", "ừ", "Ử", "ử", "Ữ", "ữ", "Ự", "ự", "Ỳ", "ỳ", 
                        "Ỵ", "ỵ", "Ỷ", "ỷ", "Ỹ", "ỹ", "\x00d5", "Ạ", "Ấ", "Ầ", "Ẩ", "Ậ", "Ằ", "Ặ", "Ẹ", "Ẽ", 
                        "Ế", "Ề", "Ể", "Ệ", "Ỉ", "Ị", "Ọ", "Ỏ", "Ổ", "Ỗ", "Ộ", "Ớ", "Ờ", "Ở", "Ợ", "Ụ", 
                        "Ủ", "Ỳ"
                     };
                    break;
                case VietEncodings.VNI:
                    _sourceChars = new string[] { 
                        "\x00d1", "\x00f1", "\x00d3", "\x00f3", "\x00d2", "\x00f2", "\x00c6", "\x00e6", "\x00ce", "\x00ee", "O\x00c2", "o\x00e2", "y\x00f5", "Y\x00d5", "y\x00fb", "Y\x00db", 
                        "y\x00f8", "Y\x00d8", "\x00f6\x00ef", "\x00d6\x00cf", "\x00f6\x00f5", "\x00d6\x00d5", "\x00f6\x00fb", "\x00d6\x00db", "\x00f6\x00f8", "\x00d6\x00d8", "\x00f6\x00f9", "\x00d6\x00d9", "u\x00fb", "U\x00db", "u\x00ef", "U\x00cf", 
                        "\x00f4\x00ef", "\x00d4\x00cf", "\x00f4\x00f5", "\x00d4\x00d5", "\x00f4\x00fb", "\x00d4\x00db", "\x00f4\x00f8", "\x00d4\x00d8", "\x00f4\x00f9", "\x00d4\x00d9", "o\x00e4", "O\x00c4", "o\x00e3", "O\x00c3", "o\x00e5", "O\x00c5", 
                        "o\x00e0", "O\x00c0", "o\x00e1", "O\x00c1", "o\x00fb", "O\x00db", "o\x00ef", "O\x00cf", "e\x00e4", "E\x00c4", "e\x00e3", "E\x00c3", "e\x00e5", "E\x00c5", "e\x00e0", "E\x00c0", 
                        "e\x00e1", "E\x00c1", "e\x00f5", "E\x00d5", "e\x00fb", "E\x00db", "e\x00ef", "E\x00cf", "a\x00eb", "A\x00cb", "a\x00fc", "A\x00dc", "a\x00fa", "A\x00da", "a\x00e8", "A\x00c8", 
                        "a\x00e9", "A\x00c9", "a\x00e4", "A\x00c4", "a\x00e3", "A\x00c3", "a\x00e5", "A\x00c5", "a\x00e0", "A\x00c0", "a\x00e1", "A\x00c1", "a\x00fb", "A\x00db", "a\x00ef", "A\x00cf", 
                        "u\x00f5", "U\x00d5", "a\x00ea", "A\x00ca", "y\x00f9", "u\x00f9", "u\x00f8", "o\x00f5", "o\x00f9", "o\x00f8", "e\x00e2", "e\x00f9", "e\x00f8", "a\x00f5", "a\x00e2", "a\x00f9", 
                        "a\x00f8", "Y\x00d9", "U\x00d9", "U\x00d8", "O\x00d5", "O\x00d9", "O\x00d8", "E\x00c2", "E\x00d9", "E\x00d8", "A\x00d5", "A\x00c2", "A\x00d9", "A\x00d8", "\x00d4", "\x00f4", 
                        "\x00d6", "\x00f6", "\x00c6", "\x00e6"
                     };
                    _unicodeChars = new string[] { 
                        "Đ", "đ", "Ĩ", "ĩ", "Ị", "ị", "Ỉ", "ỉ", "Ỵ", "ỵ", "\x00c6", "\x00e6", "ỹ", "Ỹ", "ỷ", "Ỷ", 
                        "ỳ", "Ỳ", "ự", "Ự", "ữ", "Ữ", "ử", "Ử", "ừ", "Ừ", "ứ", "Ứ", "ủ", "Ủ", "ụ", "Ụ", 
                        "ợ", "Ợ", "ỡ", "Ỡ", "ở", "Ở", "ờ", "Ờ", "ớ", "Ớ", "ộ", "Ộ", "ỗ", "Ỗ", "ổ", "Ổ", 
                        "ồ", "Ồ", "ố", "Ố", "ỏ", "Ỏ", "ọ", "Ọ", "ệ", "Ệ", "ễ", "Ễ", "ể", "Ể", "ề", "Ề", 
                        "ế", "Ế", "ẽ", "Ẽ", "ẻ", "Ẻ", "ẹ", "Ẹ", "ặ", "Ặ", "ẵ", "Ẵ", "ẳ", "Ẳ", "ằ", "Ằ", 
                        "ắ", "Ắ", "ậ", "Ậ", "ẫ", "Ẫ", "ẩ", "Ẩ", "ầ", "Ầ", "ấ", "Ấ", "ả", "Ả", "ạ", "Ạ", 
                        "ũ", "Ũ", "ă", "Ă", "\x00fd", "\x00fa", "\x00f9", "\x00f5", "\x00f3", "\x00f2", "\x00ea", "\x00e9", "\x00e8", "\x00e3", "\x00e2", "\x00e1", 
                        "\x00e0", "\x00dd", "\x00da", "\x00d9", "\x00d5", "\x00d3", "\x00d2", "\x00ca", "\x00c9", "\x00c8", "\x00c3", "\x00c2", "\x00c1", "\x00c0", "Ơ", "ơ", 
                        "Ư", "ư", "\x00d4", "\x00f4"
                     };
                    break;
                case VietEncodings.VPS:
                    _sourceChars = new string[] { 
                        "\x00cf", "\x00b3", "\x009b", "\x00fd", "\x009c", "\x0019", "\x00ff", "\x00b2", "\x00bf", "\x0015", "\x00bb", "\x001d", "\x00ba", "\x00b1", "\x00d8", "\x00af", 
                        "\x00d9", "\x00ad", "\x00fb", "\x00d1", "\x00f8", "\x0014", "\x00ae", "\x0013", "\x00ab", "\x00a6", "\x00aa", "\x009f", "\x00a9", "\x009e", "\x00a7", "\x009d", 
                        "\x00b6", "\x0012", "\x0087", "\x0099", "\x00b0", "\x0098", "\x00d2", "\x0097", "\x00d3", "\x0096", "\x00d5", "\x00bd", "\x0086", "\x0011", "\x00ce", "\x0010", 
                        "\x00cc", "\x00b7", "\x008c", "\x0006", "\x00cd", "\x0095", "\x008b", "\x0094", "\x008a", "\x0093", "\x0089", "\x0090", "\x00eb", "\x00fe", "\x00c8", "\x00de", 
                        "\x00cb", "\x0005", "\x00a5", "\x0004", "\x00a4", "\x00f0", "\x00a3", "\x008f", "\x00a2", "\x008e", "\x00a1", "\x008d", "\x00c6", "\x0003", "\x00c5", "\x001c", 
                        "\x00c4", "\x0085", "\x00c0", "\x0084", "\x00c3", "\x0083", "\x00e4", "\x0081", "\x00e5", "\x0002", "\x00dc", "\x00d0", "\x00d6", "\x00f7", "\x00db", "\x00ac", 
                        "\x00ef", "\x00b8", "\x00c7", "\x00e6", "\x0088", "\x009a", "\x00a8", "\x00be", "\x00b9", "\x00bc", "\x00f1", "\x00b4", "\x00b5", "\x00d7", "\x0082", "\x0080", 
                        "\x0080", "€", "\x0082", "‚", "š", "ˆ", "ƒ", "„", "…", "Ž", "\x0089", "“", "\x008a", "”", "‹", "•", 
                        "\x008c", "†", "–", "—", "˜", "‡", "ž", "Ÿ", "œ", "›", "™", "‰", "Œ", "Š"
                    };
                    _unicodeChars = new string[] { 
                        "ỹ", "Ỹ", "ỷ", "Ỷ", "ỵ", "Ỵ", "ỳ", "Ỳ", "ự", "Ự", "ữ", "Ữ", "ử", "Ử", "ừ", "Ừ", 
                        "ứ", "Ứ", "ủ", "Ủ", "ụ", "Ụ", "ợ", "Ợ", "ỡ", "Ỡ", "ở", "Ở", "ờ", "Ờ", "ớ", "Ớ", 
                        "ộ", "Ộ", "ỗ", "Ỗ", "ổ", "Ổ", "ồ", "Ồ", "ố", "Ố", "ỏ", "Ỏ", "ọ", "Ọ", "ị", "Ị", 
                        "ỉ", "Ỉ", "ệ", "Ệ", "ễ", "Ễ", "ể", "Ể", "ề", "Ề", "ế", "Ế", "ẽ", "Ẽ", "ẻ", "Ẻ", 
                        "ẹ", "Ẹ", "ặ", "Ặ", "ẵ", "Ẵ", "ẳ", "Ẳ", "ằ", "Ằ", "ắ", "Ắ", "ậ", "Ậ", "ẫ", "Ẫ", 
                        "ẩ", "Ẩ", "ầ", "Ầ", "ấ", "Ấ", "ả", "Ả", "ạ", "Ạ", "ư", "Ư", "ơ", "Ơ", "ũ", "Ũ", 
                        "ĩ", "Ĩ", "đ", "ă", "Ă", "\x00fd", "\x00d9", "\x00d5", "\x00d3", "\x00d2", "Đ", "\x00cd", "\x00cc", "\x00c8", "\x00c3", "\x00c0", 
                        "\x00c0", "\x00c0", "\x00c2", "\x00c3", "\x00fd", "Ă", "Ấ", "Ầ", "Ẩ", "Ằ", "ế", "Ề", "ề", "Ể", "ể", "Ễ", 
                        "ệ", "ọ", "Ố", "Ồ", "Ổ", "ỗ", "Ờ", "Ở", "ỵ", "ỷ", "Ỗ", "ế", "ệ", "ề"
                    };
                    break;
                default:
                    throw new Exception("Unsupported encoding: " + sourceEncoding);
            }
        }
        #endregion

        #region Methods
        public string Convert(string sourceString)
        {
            if (sourceString.Length <= 0) return string.Empty;
            StringBuilder stringBuilder = new StringBuilder(sourceString);
            for (int i = 0; i < _sourceChars.Length; i++)
                stringBuilder.Replace(_sourceChars[i], _unicodeChars[i]);
            return stringBuilder.ToString();
        }
        #endregion
    }
}
